%%
% Dado un conjunto de datos sData, toma una fracción f de datos y aplica el
% algorimo de agrupamiento. Ésto lo hace la cantidad de veces que es pasado f
%%
% Función que retorna los índices y los bmus de aplicar el algoritmo de agrupamiento.
% tomando, en cada iteración, la fracción f.
% La función es bastante genérica para poder utilizar la misma con cualquier tipo de
% prueba.
% @return: los bmuses y los índices obtenidos en cada iteración. 
% @params:
%   @sData: una matriz que representa el conjunto de datos.
%   @f: un vector de porciones de datos que se quiere recuperar.
%   @algoritmo_agrupamiento: el algoritmo de agrupamiento a utilizar. La interfaz de
%       la función debe ser sData y la cantidad k de cústers a encontrar.
%   @k: la cantidad de clústers o neuronas a utilizar.
function [bmuses, idxs] = bmuses_para_fraccion_dato (sData, f, algoritmo_agrupamiento, k)
    if isstruct(sData)
        sData = sData.data;
    end
    nro_fracciones = length(f);
    
    len = size(sData,1);
    %bmuses = zeros(c, nro_fracciones);
    %idxs = zeros(c, nro_fracciones);
    bmuses = cell(nro_fracciones,1);
    idxs = cell(nro_fracciones, 1);
    for i = 1:nro_fracciones
        % tomar una porsión de los datos necesaria.
        c = round(f(:,i) * len);
        sub = slice_random_index(len, c); 

        % aplicar el algoritmo de agrupamiento
        bmuses{i} = algoritmo_agrupamiento (sData(sub,:), k);
        idxs{i} = sub;
    end
end

%%
% Retorna de forma aleatoria los indices.
function indexes = slice_random_index(len, c)
    indexes = randperm(len);
    indexes = sort(indexes(1:c));
end

